import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
import matplotlib.pyplot as plt
import seaborn as sns

# ====================== 配置参数 ======================
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 设置中文字体（替换为系统已有的中文字体，如黑体）
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# ====================== 1. 数据加载与基础分析 ======================
# 读取数据
excel_file = pd.ExcelFile('信用卡精准营销模型.xlsx')
df = excel_file.parse('Sheet1')

# 查看数据基本信息
print("数据基本信息：")
df.info()
print(f"数据形状：{df.shape}（行数, 列数）")
print("\n数据前5行：")
print(df.head())

# ====================== 2. 数据处理 ======================
# 检查缺失值
print("\n缺失值统计：")
print(df.isnull().sum())

# 检查数值型特征的描述性统计（以年龄为例）
print("\n年龄描述性统计：")
print(df['年龄'].describe())

# ====================== 3. 数据分析与可视化 ======================
# 3.1 连续特征与响应的关系（箱线图）
plt.figure(figsize=(15, 12))

plt.subplot(2, 2, 1)
sns.boxplot(x='响应', y='年龄', data=df, palette='Set2')
plt.title('年龄与响应的分布')

plt.subplot(2, 2, 2)
sns.boxplot(x='响应', y='月收入（元）', data=df, palette='Set2')
plt.title('月收入与响应的分布')

plt.subplot(2, 2, 3)
sns.boxplot(x='响应', y='月消费（元）', data=df, palette='Set2')
plt.title('月消费与响应的分布')

plt.subplot(2, 2, 4)
sns.boxplot(x='响应', y='月消费/月收入', data=df, palette='Set2')
plt.title('消费收入比与响应的分布')

plt.tight_layout()
plt.show()

# 3.2 分类特征与响应的关系（性别柱状图）
plt.figure(figsize=(8, 6))
gender_response = pd.crosstab(df['性别'], df['响应'])
gender_response.plot(kind='bar', color=['#4CAF50', '#F44336'], width=0.6)
plt.title('性别与响应的关系')
plt.xlabel('性别（0=女性，1=男性）')
plt.ylabel('人数')
plt.xticks(rotation=0)
plt.show()

# 3.3 特征相关性热力图
plt.figure(figsize=(10, 8))
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('特征相关性热力图')
plt.show()

# ====================== 4. 建模与评估 ======================
# 特征与目标变量分离
X = df.drop('响应', axis=1)
y = df['响应']

# 划分训练集与测试集（分层抽样保持类别平衡）
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 初始化逻辑回归模型（增加迭代次数避免收敛警告）
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

# 输出模型性能
print("\n====================== 模型评价结果 ======================")
print(f"准确率（Accuracy）: {accuracy:.4f}")
print(f"精确率（Precision）: {precision:.4f}")
print(f"召回率（Recall）: {recall:.4f}")
print(f"F1分数（F1-Score）: {f1:.4f}")

# 输出特征重要性（系数与优势比）
coefficients = pd.DataFrame({
    '特征': X.columns,
    '系数': model.coef_[0],
    '优势比（OR）': np.round(np.exp(model.coef_[0]), 2)
}).sort_values(by='系数', ascending=False)

print("\n特征重要性（按系数降序排列）:")
print(coefficients)